(() => {
  /* 
  联合类型（Union Types）表示取值可以为多种类型中的一种。
  需求1: 定义一函数得到一个数字或字符串值的字符串形式值
  */
  function getString(a: number|string) {
    return a.toString()
  }
  console.log(getString(123), getString('abc'))

  /* 需求: 定义一个函数得到一个字符串或者数值数据的长度 */
  /* function getLength(a: string|number) {
    // return a.lenth // error

    if (a.length) { // error a有可能是number值, 没有length属性
      return a.length
    } else {
      return a.toString().length
    }
  }

  console.log(getLength(123), getLength('abc')) */


})()

;(() => {
  /* 
类型断言(Type Assertion): 可以用来手动指定一个值的类型
语法:
    方式一: <类型>值
    方式二: 值 as 类型  tsx中只能用这种方式
*/
   /* 需求: 定义一个函数得到一个字符串或者数值数据的长度 */
  function getLength(a: string|number) {
    if ((<string>a).length) {
      return (a as string).length
    } else {
      return a.toString().length
    }
  }

  console.log(getLength(123), getLength('abc'))

})()


;(() => {
  /* 
  类型推断: TS会在没有明确的指定类型的时候推测出一个类型
      定义变量时赋值了, 推断为对应的类型
      定义变量时没有赋值, 推断为any类型
  */

  let a = 1 // 类型推断为number (声明变量没有指定类型, 但赋值, 推断为值的类型)
  // a = 'abc'  // error

  let b // 类型推断为any类型 (声明变量没有指定类型, 也没赋值, 推断为any类型)
  b = 1
  b = 'abc'


})()